static void rmnet_usb_disconnect(struct usb_interface *intf) { struct usbnet *unet; struct usb_device *udev; struct rmnet_ctrl_dev *dev; udev = interface_to_usbdev(intf); unet = usb_get_intfdata(intf); if (!unet) { dev_err(&udev->dev, "%s:data device not found\n", __func__); return; } dev = (struct rmnet_ctrl_dev *)unet->data[1]; if (!dev) { dev_err(&udev->dev, "%s:ctrl device not found\n", __func__); return; } unet->data[0] = 0; unet->data[1] = 0; rmnet_usb_ctrl_disconnect(dev); device_remove_file(&unet->net->dev, &dev_attr_dbg_mask); usbnet_disconnect(intf); }
static void rmnet_usb_disconnect(struct usb_interface *intf) { struct usbnet *unet = usb_get_intfdata(intf); struct rmnet_ctrl_dev *dev; unsigned int n, rdev_cnt, unet_id; struct driver_info *info = unet->driver_info; bool mux = unet->data[4]; rdev_cnt = mux ? no_rmnet_insts_per_dev : 1; device_set_wakeup_enable(&unet->udev->dev, 0); for (n = 0; n < rdev_cnt; n++) { unet_id = n + info->data * no_rmnet_insts_per_dev; unet = mux ? unet_list[unet_id] : usb_get_intfdata(intf); device_remove_file(&unet->net->dev, &dev_attr_dbg_mask); dev = (struct rmnet_ctrl_dev *)unet->data[1]; rmnet_usb_ctrl_disconnect(dev); unet->data[0] = 0; unet->data[1] = 0; rmnet_usb_data_debugfs_cleanup(unet); usb_set_intfdata(intf, unet); usbnet_disconnect(intf); unet_list[unet_id] = NULL; } }
static void rmnet_usb_disconnect(struct usb_interface *intf) { struct usbnet *unet; struct rmnet_ctrl_dev *dev; unet = usb_get_intfdata(intf); if (!unet) { dev_err(&intf->dev, "%s:data device not found\n", __func__); return; } device_set_wakeup_enable(&unet->udev->dev, 0); rmnet_usb_data_debugfs_cleanup(unet); dev = (struct rmnet_ctrl_dev *)unet->data[1]; if (!dev) { dev_err(&intf->dev, "%s:ctrl device not found\n", __func__); return; } unet->data[0] = 0; unet->data[1] = 0; rmnet_usb_ctrl_disconnect(dev); device_remove_file(&unet->net->dev, &dev_attr_dbg_mask); usbnet_disconnect(intf); }
static void rmnet_usb_disconnect(struct usb_interface *intf) { struct usbnet *unet; struct usb_device *udev; struct rmnet_ctrl_dev *dev; udev = interface_to_usbdev(intf); device_set_wakeup_enable(&udev->dev, 0); unet = usb_get_intfdata(intf); if (!unet) { dev_err(&udev->dev, "%s:data device not found\n", __func__); return; } rmnet_usb_data_debugfs_cleanup(unet); dev = (struct rmnet_ctrl_dev *)unet->data[1]; if (!dev) { dev_err(&udev->dev, "%s:ctrl device not found\n", __func__); return; } #ifdef CONFIG_MDM_HSIC_PM unregister_udev_from_pm_dev(rmnet_pm_dev, udev); #endif unet->data[0] = 0; unet->data[1] = 0; rmnet_usb_ctrl_disconnect(dev); device_remove_file(&unet->net->dev, &dev_attr_dbg_mask); usbnet_disconnect(intf); }
static void rmnet_usb_disconnect(struct usb_interface *intf) { struct usbnet *unet; struct rmnet_ctrl_dev *dev; unet = usb_get_intfdata(intf); if (!unet) { dev_err(&intf->dev, "%s:data device not found\n", __func__); return; } device_set_wakeup_enable(&unet->udev->dev, 0); rmnet_usb_data_debugfs_cleanup(unet); dev = (struct rmnet_ctrl_dev *)unet->data[1]; if (!dev) { dev_err(&intf->dev, "%s:ctrl device not found\n", __func__); return; } unet->data[0] = 0; unet->data[1] = 0; rmnet_usb_ctrl_disconnect(dev); device_remove_file(&unet->net->dev, &dev_attr_dbg_mask); usbnet_disconnect(intf); //++SSD_RIL:20120814: For CPU/Freq min default value if ( rnmet_usb_cpu_freq_enabled == 1 ) { rmnet_usb_freq_release(); } //--SSD_RIL }
static void rmnet_usb_disconnect(struct usb_interface *intf) { struct usbnet *unet = usb_get_intfdata(intf); struct rmnet_ctrl_udev *dev; device_set_wakeup_enable(&unet->udev->dev, 0); device_remove_file(&unet->net->dev, &dev_attr_dbg_mask); dev = (struct rmnet_ctrl_udev *)unet->data[1]; rmnet_usb_ctrl_disconnect(dev); unet->data[0] = 0; unet->data[1] = 0; rmnet_usb_data_debugfs_cleanup(unet); usbnet_disconnect(intf); }
static int rmnet_usb_probe(struct usb_interface *iface, const struct usb_device_id *prod) { struct usbnet *unet; struct driver_info *info = (struct driver_info *)prod->driver_info; struct usb_device *udev; int status = 0; unsigned int i, unet_id, rdev_cnt, n = 0; bool mux; struct rmnet_ctrl_dev *dev; udev = interface_to_usbdev(iface); if (iface->num_altsetting != 1) { dev_err(&iface->dev, "%s invalid num_altsetting %u\n", __func__, iface->num_altsetting); status = -EINVAL; goto out; } mux = test_bit(info->data, &mux_enabled); if (prod->idProduct == 0x908a) mux = true; else mux = false; mux_enabled_per_pid = mux; rdev_cnt = mux ? no_rmnet_insts_per_dev : 1; info->in = 0; for (n = 0; n < rdev_cnt; n++) { info->in++; status = usbnet_probe(iface, prod); if (status < 0) { dev_err(&iface->dev, "usbnet_probe failed %d\n", status); goto out; } unet_id = n + info->data * no_rmnet_insts_per_dev; unet_list[unet_id] = unet = usb_get_intfdata(iface); unet->data[3] = n; unet->data[1] = unet->data[4] = mux; set_bit(RMNET_MODE_LLP_ETH, &unet->data[0]); rmnet_usb_setup(unet->net, mux); status = device_create_file(&unet->net->dev, &dev_attr_dbg_mask); if (status) { usbnet_disconnect(iface); goto out; } status = rmnet_usb_ctrl_probe(iface, unet->status, info->data, &unet->data[1]); if (status) { device_remove_file(&unet->net->dev, &dev_attr_dbg_mask); usbnet_disconnect(iface); goto out; } status = rmnet_usb_data_debugfs_init(unet); if (status) dev_dbg(&iface->dev, "mode debugfs file is not available\n"); } if (udev->parent && !udev->parent->parent) { device_set_wakeup_enable(&udev->dev, 1); device_set_wakeup_enable(&udev->parent->dev, 1); pm_runtime_set_autosuspend_delay(&udev->dev, 1000); pm_runtime_set_autosuspend_delay(&udev->parent->dev, 200); #if defined(CONFIG_MONITOR_STREAMING_PORT_SOCKET) && defined(CONFIG_MSM_NONSMD_PACKET_FILTER) original_autosuspend_timer = udev->dev.power.autosuspend_delay; dev_info(&udev->dev, "original_autosuspend_timer:%d\n", original_autosuspend_timer); #endif } return 0; out: for (i = 0; i < n; i++) { unet_id = i + info->data * no_rmnet_insts_per_dev; unet = unet_list[unet_id]; dev = (struct rmnet_ctrl_dev *)unet->data[1]; rmnet_usb_data_debugfs_cleanup(unet); rmnet_usb_ctrl_disconnect(dev); device_remove_file(&unet->net->dev, &dev_attr_dbg_mask); usb_set_intfdata(iface, unet_list[unet_id]); usbnet_disconnect(iface); unet_list[unet_id] = NULL; } return status; }
static int rmnet_usb_probe(struct usb_interface *iface, const struct usb_device_id *prod) { struct usbnet *unet; struct driver_info *info = (struct driver_info *)prod->driver_info; struct usb_device *udev; int status = 0; unsigned int i, unet_id, rdev_cnt, n = 0; bool mux; struct rmnet_ctrl_dev *dev; udev = interface_to_usbdev(iface); if (iface->num_altsetting != 1) { dev_err(&iface->dev, "%s invalid num_altsetting %u\n", __func__, iface->num_altsetting); status = -EINVAL; goto out; } mux = test_bit(info->data, &mux_enabled); rdev_cnt = mux ? no_rmnet_insts_per_dev : 1; info->in = 0; for (n = 0; n < rdev_cnt; n++) { /* Use this filed to increment device count this will be * used by bind to determin the forward link and reverse * link network interface names. */ info->in++; status = usbnet_probe(iface, prod); if (status < 0) { dev_err(&iface->dev, "usbnet_probe failed %d\n", status); goto out; } unet_id = n + info->data * no_rmnet_insts_per_dev; unet_list[unet_id] = unet = usb_get_intfdata(iface); /*store mux id for later access*/ unet->data[3] = n; /*save mux info for control and usbnet devices*/ unet->data[1] = unet->data[4] = mux; /*set rmnet operation mode to eth by default*/ set_bit(RMNET_MODE_LLP_ETH, &unet->data[0]); /*update net device*/ rmnet_usb_setup(unet->net, mux); /*create /sys/class/net/rmnet_usbx/dbg_mask*/ status = device_create_file(&unet->net->dev, &dev_attr_dbg_mask); if (status) { usbnet_disconnect(iface); goto out; } status = rmnet_usb_ctrl_probe(iface, unet->status, info->data, &unet->data[1]); if (status) { device_remove_file(&unet->net->dev, &dev_attr_dbg_mask); usbnet_disconnect(iface); goto out; } status = rmnet_usb_data_debugfs_init(unet); if (status) dev_dbg(&iface->dev, "mode debugfs file is not available\n"); } usb_enable_autosuspend(udev); if (udev->parent && !udev->parent->parent) { /* allow modem and roothub to wake up suspended system */ device_set_wakeup_enable(&udev->dev, 1); device_set_wakeup_enable(&udev->parent->dev, 1); } return 0; out: for (i = 0; i < n; i++) { /* This cleanup happens only for MUX case */ unet_id = i + info->data * no_rmnet_insts_per_dev; unet = unet_list[unet_id]; dev = (struct rmnet_ctrl_dev *)unet->data[1]; rmnet_usb_data_debugfs_cleanup(unet); rmnet_usb_ctrl_disconnect(dev); device_remove_file(&unet->net->dev, &dev_attr_dbg_mask); usb_set_intfdata(iface, unet_list[unet_id]); usbnet_disconnect(iface); unet_list[unet_id] = NULL; } return status; }
static int rmnet_usb_probe(struct usb_interface *iface, const struct usb_device_id *prod) { struct usbnet *unet; struct driver_info *info = (struct driver_info *)prod->driver_info; struct usb_device *udev; int status = 0; unsigned int i, unet_id, rdev_cnt, n = 0; bool mux; struct rmnet_ctrl_dev *dev; udev = interface_to_usbdev(iface); if (iface->num_altsetting != 1) { dev_err(&iface->dev, "%s invalid num_altsetting %u\n", __func__, iface->num_altsetting); status = -EINVAL; goto out; } mux = test_bit(info->data, &mux_enabled); rdev_cnt = mux ? no_rmnet_insts_per_dev : 1; info->in = 0; for (n = 0; n < rdev_cnt; n++) { /* */ info->in++; status = usbnet_probe(iface, prod); if (status < 0) { dev_err(&iface->dev, "usbnet_probe failed %d\n", status); goto out; } unet_id = n + info->data * no_rmnet_insts_per_dev; unet_list[unet_id] = unet = usb_get_intfdata(iface); /* */ unet->data[3] = n; /* */ unet->data[1] = unet->data[4] = mux; /* */ set_bit(RMNET_MODE_LLP_ETH, &unet->data[0]); /* */ rmnet_usb_setup(unet->net, mux); /* */ status = device_create_file(&unet->net->dev, &dev_attr_dbg_mask); if (status) { usbnet_disconnect(iface); goto out; } status = rmnet_usb_ctrl_probe(iface, unet->status, info->data, &unet->data[1]); if (status) { device_remove_file(&unet->net->dev, &dev_attr_dbg_mask); usbnet_disconnect(iface); goto out; } status = rmnet_usb_data_debugfs_init(unet); if (status) dev_dbg(&iface->dev, "mode debugfs file is not available\n"); } usb_enable_autosuspend(udev); if (udev->parent && !udev->parent->parent) { /* */ device_set_wakeup_enable(&udev->dev, 1); device_set_wakeup_enable(&udev->parent->dev, 1); } return 0; out: for (i = 0; i < n; i++) { /* */ unet_id = i + info->data * no_rmnet_insts_per_dev; unet = unet_list[unet_id]; dev = (struct rmnet_ctrl_dev *)unet->data[1]; rmnet_usb_data_debugfs_cleanup(unet); rmnet_usb_ctrl_disconnect(dev); device_remove_file(&unet->net->dev, &dev_attr_dbg_mask); usb_set_intfdata(iface, unet_list[unet_id]); usbnet_disconnect(iface); unet_list[unet_id] = NULL; } return status; }