static int baseband_usb_driver_probe(struct usb_interface *intf, const struct usb_device_id *id) { // int i = g_i; int i; int err =0; pr_debug("%s(%d) { intf %p id %p\n", __func__, __LINE__, intf, id); pr_debug("i %d\n", i); pr_debug("intf->cur_altsetting->desc.bInterfaceNumber %02x\n", intf->cur_altsetting->desc.bInterfaceNumber); pr_debug("intf->cur_altsetting->desc.bAlternateSetting %02x\n", intf->cur_altsetting->desc.bAlternateSetting); pr_debug("intf->cur_altsetting->desc.bNumEndpoints %02x\n", intf->cur_altsetting->desc.bNumEndpoints); pr_debug("intf->cur_altsetting->desc.bInterfaceClass %02x\n", intf->cur_altsetting->desc.bInterfaceClass); pr_debug("intf->cur_altsetting->desc.bInterfaceSubClass %02x\n", intf->cur_altsetting->desc.bInterfaceSubClass); pr_debug("intf->cur_altsetting->desc.bInterfaceProtocol %02x\n", intf->cur_altsetting->desc.bInterfaceProtocol); pr_debug("intf->cur_altsetting->desc.iInterface %02x\n", intf->cur_altsetting->desc.iInterface); /* if (g_usb_interface_index[i] != intf->cur_altsetting->desc.bInterfaceNumber) { pr_debug("%s(%d) } -ENODEV\n", __func__, __LINE__); return -ENODEV; } else { g_usb_interface[i] = intf; }*/ for (i = 0; i < MAX_INTFS; i++) { if(intf->cur_altsetting->desc.bInterfaceNumber == usb_net_raw_ip_intf[i] ) { g_usb_interface[i] = intf; break; } } printk("\n**********wjp********* %d \n",i); if(i >= MAX_INTFS ) { printk("the current interface number is %d",intf->cur_altsetting->desc.bInterfaceNumber); return -ENODEV; } baseband_usb_open(baseband_usb_net[i],i, usb_net_raw_ip_intf[i]); /* start usb rx */ err = usb_net_raw_ip_rx_urb_submit(baseband_usb_net[i]); if (err < 0) { pr_err("submit rx failed - err %d\n", err); // goto error_exit; } pr_debug("%s(%d) }\n", __func__, __LINE__); return 0; }
static int usb_net_raw_ip_init(void) { int i; int err; char name[32]; pr_debug("usb_net_raw_ip_init {\n"); /* create multiple raw-ip network devices */ for (i = 0; i < max_intfs; i++) { /* open baseband usb */ g_i = i; baseband_usb_net[i] = baseband_usb_open(i, usb_net_raw_ip_vid, usb_net_raw_ip_pid, usb_net_raw_ip_intf[i]); if (!baseband_usb_net[i]) { pr_err("cannot open baseband usb net\n"); err = -1; goto error_exit; } /* register network device */ usb_net_raw_ip_dev[i] = alloc_netdev(0, BASEBAND_USB_NET_DEV_NAME, ether_setup); if (!usb_net_raw_ip_dev[i]) { pr_err("alloc_netdev() failed\n"); err = -ENOMEM; goto error_exit; } usb_net_raw_ip_dev[i]->netdev_ops = &usb_net_raw_ip_ops; usb_net_raw_ip_dev[i]->watchdog_timeo = TX_TIMEOUT; random_ether_addr(usb_net_raw_ip_dev[i]->dev_addr); err = register_netdev(usb_net_raw_ip_dev[i]); if (err < 0) { pr_err("cannot register network device - %d\n", err); goto error_exit; } pr_debug("registered baseband usb network device" " - dev %p name %s\n", usb_net_raw_ip_dev[i], BASEBAND_USB_NET_DEV_NAME); /* start usb rx */ err = usb_net_raw_ip_setup_rx_urb(baseband_usb_net[i]); if (err < 0) { pr_err("setup reusable rx urb failed - err %d\n", err); goto error_exit; } err = usb_net_raw_ip_rx_urb_submit(baseband_usb_net[i]); if (err < 0) { pr_err("submit rx failed - err %d\n", err); goto error_exit; } /* start usb tx */ init_usb_anchor(&baseband_usb_net[i]->usb.tx_urb_deferred); sprintf(name, "raw_ip_tx_wq-%d", baseband_usb_net[i]->baseband_index); baseband_usb_net[i]->usb.tx_workqueue = create_singlethread_workqueue(name); if (!baseband_usb_net[i]->usb.tx_workqueue) { pr_err("cannot create workqueue\n"); goto error_exit; } INIT_WORK(&baseband_usb_net[i]->usb.tx_work, usb_net_raw_ip_tx_urb_work); } pr_debug("usb_net_raw_ip_init }\n"); return 0; error_exit: /* destroy multiple raw-ip network devices */ for (i = 0; i < max_intfs; i++) { /* unregister network device */ if (usb_net_raw_ip_dev[i]) { unregister_netdev(usb_net_raw_ip_dev[i]); free_netdev(usb_net_raw_ip_dev[i]); usb_net_raw_ip_dev[i] = (struct net_device *) 0; } /* close baseband usb */ if (baseband_usb_net[i]) { /* stop usb tx */ if (baseband_usb_net[i]->usb.tx_workqueue) { destroy_workqueue(baseband_usb_net[i] ->usb.tx_workqueue); baseband_usb_net[i]->usb.tx_workqueue = (struct workqueue_struct *) 0; } if (baseband_usb_net[i]->usb.tx_urb) { usb_kill_urb(baseband_usb_net[i]->usb.tx_urb); baseband_usb_net[i]->usb.tx_urb = (struct urb *) 0; } /* stop usb rx */ if (baseband_usb_net[i]->usb.rx_urb) { usb_kill_urb(baseband_usb_net[i]->usb.rx_urb); baseband_usb_net[i]->usb.rx_urb = (struct urb *) 0; } usb_net_raw_ip_free_rx_urb(baseband_usb_net[i]); /* close usb */ baseband_usb_close(baseband_usb_net[i]); baseband_usb_net[i] = (struct baseband_usb *) 0; } } return err; }